import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar [进度条]
import 'nprogress/nprogress.css' // progress bar style [进度条样式]
import { getToken } from '@/utils/auth' // get token from cookie [从cookie中获取token]
import getPageTitle from '@/utils/get-page-title'
import { canTurnTo } from '@/utils/access' // 获得用户信息 

NProgress.configure({ showSpinner: false }) // NProgress Configuration [NProgress配置]

// const whiteList = ['/login'] // no redirect whitelist [没有重定向白名单]

// to：将要跳转的路由路径； access：存储用户权限的数组；next：是一个方法，调用该方法跳转页面
const turnTo = (to, access, next) => {
        console.log(typeof to)
        console.log(typeof access)
        console.log(typeof next)
            // router.options 返回一个对象 { routes[路由组] ，scroll Behavior[滚动行为]}
        var can = canTurnTo(to.name, access, router.options.routes)
            // console.log(router.options.routes) // 直接返回路由表里面的路由路径
        if (can) next() // 有权限，可访问
        else next({ replace: true, name: 'error_401' }) // 五权限，重定向到401页面
    }
    // 全局钩子router.beforeEach拦截路由 判断是否已获得token在获得token之后我们就去获得用户信息
router.beforeEach(async(to, from, next) => {
    // start progress bar [开始进度条]
    NProgress.start()

    // set page title [设置页面标题]
    // getPageTitle[获取页面标题]
    document.title = getPageTitle(to.meta.title)

    // determine whether the user has logged in [确定用户是否已经登录]
    // 判断用户是否登录，登录了是否有用户信息，有用户信息是否有权限访问要跳转的路由
    const hasToken = getToken()
    if (hasToken) {
        if (to.path === '/login') {
            // 登录后，试图重定向到登录页面的，重新跳转到应用首页
            next({ path: '/' })
            NProgress.done()
        } else {
            var userInfo = store.state.user.name
            if (userInfo) {
                turnTo(to, store.state.user.access, next)
            } else {
                console.log('登录成功，已经有token，但是还没有用户信息，准备获用户信息')
                store.dispatch('user/getInfo').then(user => {
                    // 拉取用户信息，通过用户权限和跳转的页面的name来判断是否有权限访问;
                    // access必须是一个数组，如：['super_admin'] ['super_admin', 'admin']
                    turnTo(to, user.access, next)
                }).catch(() => {
                    // 获取用户信息失败，重置token
                    store.dispatch('user/resetToken')
                    next('/login')
                    console.log("获取用户信息失败")
                })
            }
        }
    } else {
        // 没有登录（因为没有token）

        if (to.path === '/login') {
            next()
        } else {
            next('/login')
            NProgress.done()
        }
    }

    // if (hasToken) {
    //     if (to.path === '/login') {
    //         // if is logged in, redirect to the home page [如果已登录，则重定向到主页]
    //         // 登录后，试图重定向到登录页面的，重新跳转到应用首页
    //         next({ path: '/' })
    //         NProgress.done()
    //     } else {
    //         const hasGetUserInfo = store.getters.name
    //         if (hasGetUserInfo) {
    //             next()
    //         } else {
    //             try {
    //                 // get user info
    //                 await store.dispatch('user/getInfo')
    //                 next()
    //             } catch (error) {
    //                 // remove token and go to login page to re-login
    //                 await store.dispatch('user/resetToken')
    //                 Message.error(error || 'Has Error')
    //                 next(`/login?redirect=${to.path}`)
    //                 NProgress.done()
    //             }
    //         }
    //     }
    // } else {
    //     /* has no token*/

    //     if (whiteList.indexOf(to.path) !== -1) {
    //         // in the free login whitelist, go directly
    //         next()
    //     } else {
    //         // other pages that do not have permission to access are redirected to the login page.
    //         next(`/login?redirect=${to.path}`)
    //         NProgress.done()
    //     }
    // }


})

router.afterEach(() => {
    // finish progress bar
    NProgress.done()
})